home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / file.s < prev    next >
Text File  |  2000-01-24  |  25KB  |  1,159 lines

  1.     .include    doscall.mac
  2.     .include    dosconst.equ
  3.     .include    global.mac
  4.  
  5. ;----------------------------------------------------------------
  6. ;ファイルをオープンする
  7. ;<current_param_ptr.l:パラメータバッファのアドレス
  8. ;>next_param_ptr.l:次のパラメータバッファのアドレス
  9. ;>d0.l:負数=エラー,0=データなし正常終了,その他=データあり
  10. ;>n-flag:mi=エラー
  11. ;>z-flag:eq=データなし正常終了
  12.     .text
  13.     .align    4,$2048
  14. open_file::
  15.     movem.l    d1-d7/a0-a6,-(sp)
  16.  
  17.     movea.l    current_param_ptr,a2
  18.  
  19.     lea.l    (pb_size,a2),a0
  20.     move.l    a0,next_param_ptr
  21.  
  22.     lea.l    filename_buffer,a4
  23.  
  24.     tst.b    (pb_files,a2)
  25.     bne    20f            ;ワイルドカード検索中
  26.  
  27.     movea.l    a4,a0            ;ファイル名のバッファ
  28.     movea.l    (pb_ptr,a2),a1        ;ファイル名
  29.     bsr    fullpath        ;フルパスにする
  30.     adda.l    d0,a0            ;主ファイル名の先頭
  31.     move.l    a0,filename_nameptr
  32.     moveq.l    #'?',d0
  33.     bsr    strchr
  34.     bpl    10f            ;ワイルドカードあり
  35.     moveq.l    #'*',d0
  36.     bsr    strchr
  37.     bpl    10f            ;ワイルドカードあり
  38.  
  39. ;ワイルドカードなし
  40.     movea.l    a4,a0
  41.     cmpi.b    #'-',(a0)+
  42.     bne    40f            ;ワイルドカードなし,標準入力ではない
  43.     tst.b    (a0)
  44.     bne    40f            ;ワイルドカードなし,標準入力ではない
  45.  
  46. ;ワイルドカードなし,標準入力
  47.     clr.w    fileno            ;標準入力
  48.     bra    50f
  49.  
  50. ;ワイルドカードあり
  51. 10:    lea.l    files_buffer,a5
  52.     move.w    #$20,-(sp)        ;ファイルを検索
  53.     move.l    a4,-(sp)        ;フルパスでワイルドカードを含むファイル名
  54.     move.l    a5,-(sp)        ;_FILESのバッファ
  55.     DOS    _FILES
  56.     lea.l    (10,sp),sp
  57.     tst.l    d0
  58.     bmi    80f            ;ファイルが見つからない
  59.     st.b    (pb_files,a2)
  60.     bra    30f
  61.  
  62. ;ワイルドカード検索中
  63. 20:    lea.l    files_buffer,a5
  64.     move.l    a5,-(sp)        ;_FILESのバッファ
  65.     DOS    _NFILES
  66.     addq.l    #4,sp
  67.     tst.l    d0
  68.     bpl    30f
  69.     sf.b    (pb_files,a2)
  70.     sf.b    (pb_is_cdxa,a2)
  71.     bra    90f            ;ワイルドカード検索終わり
  72.  
  73. ;ワイルドカードに該当するファイルが見つかった
  74. 30:    movea.l    filename_nameptr,a0
  75.     lea.l    (fiName,a5),a1
  76.     bsr    strcpy
  77.  
  78.     move.l    a2,next_param_ptr
  79.  
  80. ;ワイルドカードなし,標準入力ではない
  81. 40:    clr.w    -(sp)
  82.     move.l    a4,-(sp)
  83.     DOS    _OPEN
  84.     addq.l    #6,sp
  85.     tst.l    d0
  86.     bmi    80f            ;ファイルが見つからない
  87.     move.w    d0,fileno
  88.  
  89. 50:    move.w    #2,-(sp)
  90.     clr.l    -(sp)
  91.     move.w    fileno,-(sp)
  92.     DOS    _SEEK
  93.     move.l    d0,d4            ;データのサイズ
  94.     clr.w    (6,sp)
  95.     DOS    _SEEK
  96.     addq.l    #8,sp
  97.  
  98.     move.l    current_file_frequency,d2    ;サンプリング周波数の指定
  99.                     ;フォーマットの指定があるときは,
  100.                     ;サンプリング周波数の指定もあるはず
  101.     move.w    current_file_format,d6    ;フォーマットの指定
  102.     bpl    20f            ;フォーマット指定済み
  103.     move.l    a4,d0
  104.     beq    10f            ;標準入力なので拡張子を得られない
  105.     moveq.l    #'.',d0
  106.     movea.l    a4,a0
  107.     bsr    strrchr
  108.     bmi    10f            ;'.'がない
  109.     adda.l    d0,a0            ;最後の'.'の位置
  110.  
  111. ;拡張子.m??と.s??と.p16
  112.     moveq.l    #MS16B,d6
  113.     lea.l    (str_dot_mono_table,pc),a3
  114.     bra    2f
  115. 1:    movea.l    (a3)+,a1
  116.     bsr    stricmp
  117.     beq    20f
  118. 2:    move.l    (a3)+,d2
  119.     bne    1b
  120.     moveq.l    #SS16B,d6
  121.     lea.l    (str_dot_stereo_table,pc),a3
  122.     bra    2f
  123. 1:    movea.l    (a3)+,a1
  124.     bsr    stricmp
  125.     beq    20f
  126. 2:    move.l    (a3)+,d2
  127.     bne    1b
  128.  
  129. ;拡張子.pcm
  130.     moveq.l    #ADPCM,d6
  131.     move.l    #15625,d2
  132.     lea.l    (str_dot_pcm,pc),a1
  133.     bsr    stricmp
  134.     beq    20f
  135.  
  136. ;拡張子.fmpはCDXAチェックをスキップする(CD-ROMドライブの特殊な操作をなるべく避けるため)
  137.     lea.l    (str_dot_fmp,pc),a1
  138.     bsr    stricmp
  139.     beq    10f
  140.  
  141. ;CDXAファイルは_READできないので,ヘッダをチェックする前にCDXAかどうか調べる必要がある
  142.     movea.l    a4,a0
  143.     bsr    is_cdxa_file        ;CDXAのチェック
  144.     bmi    10f
  145.     st.b    (pb_is_cdxa,a2)
  146.     move.l    d0,(pb_cdxa_start,a2)
  147.     move.l    d1,(pb_cdxa_length,a2)
  148.     bra    98f
  149.  
  150. 10:    move.w    fileno,d0
  151.     bsr    fmp_check        ;FMPフォーマットのチェック
  152.     bmi    10f            ;FMPフォーマットではない
  153.     bne    84f            ;未対応のFMPデータ
  154.     move.l    d2,d0
  155.     bsr    frequency_to_timerd_count
  156.     bmi    84f
  157.     move.b    d0,data_timerd_count
  158.     moveq.l    #SFMP,d6
  159.     subq.l    #1,d1
  160.     bne    20f
  161.     moveq.l    #MFMP,d6
  162.     bra    20f
  163.  
  164. 10:    move.w    fileno,d0
  165.     bsr    wave_check        ;WAVEフォーマットのチェック
  166.     bmi    10f            ;WAVEフォーマットではない
  167.     bne    83f            ;未対応のWAVEデータ
  168.     moveq.l    #SS16L,d6
  169.     subq.l    #1,d1
  170.     bne    20f
  171.     moveq.l    #MS16L,d6
  172.     bra    20f
  173.  
  174. 10:    move.w    fileno,d0
  175.     bsr    aiff_check        ;AIFFフォーマットのチェック
  176.     bmi    10f            ;AIFFフォーマットではない
  177.     bne    85f            ;未対応のAIFFデータ
  178.     moveq.l    #SS16B,d6
  179.     subq.l    #1,d1
  180.     bne    20f
  181.     moveq.l    #MS16B,d6
  182.     bra    20f
  183.  
  184. 10:    move.w    fileno,-(sp)
  185.     DOS    _CLOSE
  186.     addq.l    #2,sp
  187.     move.w    #-1,fileno
  188.     bra    82f            ;フォーマットが不明
  189.  
  190. 20:    move.w    d6,data_format        ;データのフォーマット
  191.     move.l    d2,data_frequency    ;データのサンプリング周波数
  192.  
  193.     movea.l    current_param_ptr,a0
  194.     cmpi.l    #$80000000,(pb_trktop,a0)
  195.     bne    86f
  196.     cmpi.l    #$7FFFFFFF,(pb_trkbtm,a0)
  197.     bne    86f
  198.     cmpi.l    #$80000000,(pb_idxtop,a0)
  199.     bne    86f
  200.     cmpi.l    #$7FFFFFFF,(pb_idxbtm,a0)
  201.     bne    86f
  202.     cmpi.l    #1,(pb_rangetype,a0)
  203.     bne    1f
  204. ;<ofs>の場合
  205.     cmpi.l    #$80000000,(pb_top,a0)
  206.     bgt    @f
  207.     clr.l    (pb_top,a0)
  208. @@:    cmpi.l    #$7FFFFFFF,(pb_btm,a0)
  209.     blt    @f
  210.     move.l    d4,(pb_btm,a0)
  211. @@:
  212.     tst.l    (pb_top,a0)
  213.     blt    87f
  214.     cmp.l    (pb_btm,a0),d4
  215.     blt    87f
  216.     move.w    #1,-(sp)
  217.     move.l    (pb_top,a0),-(sp)
  218.     move.w    fileno,-(sp)
  219.     DOS    _SEEK
  220.     addq.l    #8,sp
  221.     tst.l    d0
  222.     bmi    87f
  223.     move.l    (pb_btm,a0),d4
  224.     sub.l    (pb_top,a0),d4
  225.     bra    2f
  226. 1:
  227. ;<msf>の場合
  228.  
  229. 2:
  230.  
  231.     and.b    #$FE,d4            ;データのサイズを偶数にする
  232.     move.l    d4,filesize        ;データのサイズ
  233.     move.l    d4,restsize        ;データの残りサイズ
  234.  
  235.     tst.b    silent_flag
  236.     bne    1f
  237.     bsr    71f
  238.     lea.l    (m_open_file_1,pc),a0
  239.     tst.b    conv_flag
  240.     beq    @f
  241.     lea.l    (m_open_file_2,pc),a0
  242. @@:    bsr    eprintcrlf
  243. 1:
  244.  
  245.   .if 0
  246.     move.w    fileno,-(sp)
  247.     bsr    is68000
  248.     bne    1f
  249.     DOS    $FF7C            ;_GET_FCB_ADR,V2にもある
  250.     bra    2f
  251. 1:    DOS    $FFAC            ;_GET_FCB_ADR
  252. 2:    addq.l    #2,sp
  253.     movea.l    d0,a1
  254.     bsr    super
  255.     tst.b    (1,a1)
  256.     bmi    81f            ;キャラクタデバイス
  257.     movea.l    (2,a1),a1        ;内部DPBテーブル
  258.     tst.w    (10,a1)
  259.     beq    1f            ;特殊デバイス
  260.     move.b    (26,a1),d0        ;メディアバイト
  261.     cmp.b    #$F0,d0
  262.     blo    2f
  263.     cmp.b    #$F7,d0
  264.     bhi    2f
  265. 1:    st.b    file_scsi_flag
  266.     bra    3f
  267. 2:    sf.b    file_scsi_flag
  268. 3:    bsr    user
  269.   .endif
  270.  
  271. 98:    moveq.l    #1,d0            ;データあり
  272.  
  273. 99:    movem.l    (sp)+,d1-d7/a0-a6
  274.     rts
  275.  
  276.  
  277. 86:    move.w    #EXIT_ILLEGAL_RANGE,exit_code
  278.     bsr    70f
  279.     lea.l    (m_file_illegal_range,pc),a0
  280.     bra    89f
  281. 87:    move.w    #EXIT_OUT_OF_RANGE,exit_code
  282.     bsr    70f
  283.     lea.l    (m_file_out_of_range,pc),a0
  284.     bra    89f
  285. 80:    move.w    #EXIT_FILE_NOT_FOUND,exit_code
  286.     bsr    70f
  287.     lea.l    (m_file_not_found,pc),a0
  288.     bra    89f
  289. 82:    move.w    #EXIT_UNKNOWN_FORMAT,exit_code
  290.     bsr    70f
  291.     lea.l    (m_unknown_format,pc),a0
  292.     bra    89f
  293. 83:    move.w    #EXIT_UNKNOWN_WAVE,exit_code
  294.     bsr    70f
  295.     lea.l    (m_unknown_wave,pc),a0
  296.     bra    89f
  297. 84:    move.w    #EXIT_UNKNOWN_FMP,exit_code
  298.     bsr    70f
  299.     lea.l    (m_unknown_fmp,pc),a0
  300.     bra    89f
  301. 85:    move.w    #EXIT_UNKNOWN_AIFF,exit_code
  302.     bsr    70f
  303.     lea.l    (m_unknown_aiff,pc),a0
  304.   .if 0
  305.     bra    89f
  306. 81:    bsr    user
  307.     lea.l    (m_character_device,pc),a0
  308.   .endif
  309. 89:    bsr    eprintcrlf
  310. 90:    moveq.l    #-1,d0
  311.     bra    99b
  312.  
  313. 70:    bsr    eaonly
  314. 71:    lea.l    (m_stdin_message,pc),a0
  315.     cmpi.b    #'-',(a4)
  316.     bne    @f
  317.     tst.b    (1,a4)
  318.     beq    eprint
  319. @@:    lea.l    (m_file_message1,pc),a0
  320.     bsr    eprint
  321.     movea.l    a4,a0
  322.     bsr    eprint
  323.     lea.l    (m_file_message2,pc),a0
  324.     bra    eprint
  325.  
  326.     .align    4
  327. str_dot_mono_table:
  328.     .dc.l    16000,str_dot_m16
  329.     .dc.l    18900,str_dot_m19
  330.     .dc.l    22050,str_dot_m22
  331.     .dc.l    24000,str_dot_m24
  332.     .dc.l    32000,str_dot_m32
  333.     .dc.l    37800,str_dot_m38
  334.     .dc.l    44100,str_dot_m44
  335.     .dc.l    48000,str_dot_m48
  336.     .dc.l    15625,str_dot_p16
  337.     .dc.l    0
  338.  
  339.     .align    4
  340. str_dot_stereo_table:
  341.     .dc.l    16000,str_dot_s16
  342.     .dc.l    18900,str_dot_s19
  343.     .dc.l    22050,str_dot_s22
  344.     .dc.l    24000,str_dot_s24
  345.     .dc.l    32000,str_dot_s32
  346.     .dc.l    37800,str_dot_s38
  347.     .dc.l    44100,str_dot_s44
  348.     .dc.l    48000,str_dot_s48
  349.     .dc.l    0
  350.  
  351. str_dot_m16:    .dc.b    '.m16',0
  352. str_dot_m19:    .dc.b    '.m19',0
  353. str_dot_m22:    .dc.b    '.m22',0
  354. str_dot_m24:    .dc.b    '.m24',0
  355. str_dot_m32:    .dc.b    '.m32',0
  356. str_dot_m38:    .dc.b    '.m38',0
  357. str_dot_m44:    .dc.b    '.m44',0
  358. str_dot_m48:    .dc.b    '.m48',0
  359.  
  360. str_dot_s16:    .dc.b    '.s16',0
  361. str_dot_s19:    .dc.b    '.s19',0
  362. str_dot_s22:    .dc.b    '.s22',0
  363. str_dot_s24:    .dc.b    '.s24',0
  364. str_dot_s32:    .dc.b    '.s32',0
  365. str_dot_s38:    .dc.b    '.s38',0
  366. str_dot_s44:    .dc.b    '.s44',0
  367. str_dot_s48:    .dc.b    '.s48',0
  368.  
  369. str_dot_pcm:    .dc.b    '.pcm',0
  370. str_dot_p16:    .dc.b    '.p16',0
  371.  
  372. str_dot_fmp:    .dc.b    '.fmp',0
  373.  
  374. m_stdin_message:    .dc.b    '標準入力',0
  375. m_file_message1::    .dc.b    "ファイル `",0
  376. m_file_message2::    .dc.b    "' ",0
  377. m_open_file_1:        .dc.b    'を再生します',0
  378. m_open_file_2:        .dc.b    'を変換します',0
  379. m_file_illegal_range:    .dc.b    'の再生範囲が間違っています',0
  380. m_file_out_of_range:    .dc.b    'の再生範囲が範囲外です',0
  381. m_file_not_found:    .dc.b    'が見つかりません',0
  382. m_unknown_format:    .dc.b    'のデータの種類が不明です',0
  383. m_unknown_wave:        .dc.b    'は未対応の WAVE データです',0
  384. m_unknown_fmp:        .dc.b    'は未対応の FMP データです',0
  385. m_unknown_aiff:        .dc.b    'は未対応の AIFF データです',0
  386.   .if 0
  387. m_character_device:    .dc.b    'キャラクタデバイスでは処理できません',0
  388.   .endif
  389.     .even
  390.  
  391.     .data
  392.     .even
  393. fileno:            .dc.w    -1
  394.  
  395.     .bss
  396.   .if 0
  397. file_scsi_flag:        .ds.b    1
  398.   .endif
  399.     .align    4
  400. filesize:        .ds.l    1    ;データのサイズ
  401. restsize:        .ds.l    1    ;データの残りサイズ
  402.  
  403.     .bss
  404.     .align    4
  405. filename_nameptr:    .ds.l    1
  406. filename_buffer:    .ds.b    92
  407.     .even
  408. files_buffer:        .ds.b    fiSize
  409.  
  410. ;----------------------------------------------------------------
  411. ;ファイルを読み込む
  412. ;<a0.l:出力バッファの先頭
  413. ;<a1.l:入力バッファの先頭
  414. ;>d0.l:データのサイズ,-1=エラー
  415.     .text
  416.     .align    4,$2048
  417. read_file::
  418.     movem.l    d1-d7/a0-a6,-(sp)
  419.     cmpi.w    #SFMP,data_format
  420.     beq    1f
  421.     cmpi.w    #MFMP,data_format
  422.     beq    1f
  423.     move.l    a0,d7            ;バッファのアドレス
  424.     movea.l    a1,a6            ;開始アドレス
  425.     movea.l    a1,a2            ;開始アドレス
  426.     bra    2f
  427. 1:
  428. ;FMPフォーマットの場合は出力バッファに読み込む
  429.     move.l    a0,d7            ;バッファのアドレス
  430.     movea.l    a0,a6            ;開始アドレス
  431.     movea.l    a0,a2            ;開始アドレス
  432. 2:
  433.  
  434.   .if TEST_68000=0
  435.     IS68000    d0
  436.     bne    @f
  437.   .endif
  438.     tst.b    wave_data_flag
  439.     beq    @f
  440.     addq.l    #1,a2            ;68000でlittle-endianのとき
  441. @@:
  442.  
  443.     move.l    restsize,d0        ;データの残りのサイズ
  444.     beq    99f
  445.     move.l    bufhsiz,d5        ;バッファのサイズ
  446.     move.b    read_shift_count,d1
  447.     lsr.l    d1,d5
  448.     cmp.l    d5,d0
  449.     bls    @f
  450.     move.l    d5,d0
  451. @@:
  452.  
  453.     tst.b    xx_data_flag
  454.     beq    @f
  455.     and.l    #-16,d0
  456.     beq    99f
  457. @@:
  458.  
  459.     sub.l    d0,restsize
  460.     movea.l    d0,a5            ;今回の転送バイト数
  461.  
  462. 10:    move.l    stpsiz,d5
  463.     cmp.l    a5,d5
  464.     bls    @f
  465.     move.l    a5,d5
  466. @@:    suba.l    d5,a5            ;残りバイト数
  467.  
  468.     move.l    d5,-(sp)
  469.     move.l    a2,-(sp)
  470.     move.w    fileno,-(sp)
  471.     bsr    scsi_hard_soft_on
  472.     move.w    #EXIT_BREAK,exit_code
  473.     DOS    _READ
  474.     clr.w    exit_code
  475.     bsr    scsi_hard_soft_off
  476.     lea.l    (10,sp),sp
  477.     tst.l    d0
  478.     bmi    80f
  479.  
  480.     adda.l    d0,a2            ;次回のアドレス
  481.  
  482.     cmp.l    d5,d0
  483.     beq    @f
  484.     clr.l    restsize        ;読み出せなければ中止(エラーなし)
  485.     bra    11f
  486. @@:
  487.  
  488.   .if CURRENT_TIME=0
  489.     moveq.l    #'.',d0
  490.     bsr    silent_eputchar
  491.   .endif
  492.  
  493.     tst.b    esc_aborted
  494.     bne    90f
  495.  
  496.     move.l    a5,d0            ;残りバイト数
  497.     bne    10b
  498. 11:
  499.  
  500. ;68000のとき必要ならばmovepを使ったエンディアン変換を行う
  501.   .if TEST_68000=0
  502.     IS68000    d0
  503.     bne    @f
  504.   .endif
  505.     tst.b    wave_data_flag
  506.     beq    @f
  507.     subq.l    #1,a2            ;68000でlittle-endianのとき
  508.     move.l    a2,d0
  509.     sub.l    a6,d0
  510.     movea.l    a6,a0
  511.     bsr    convert_endian_68000
  512. @@:
  513.  
  514.     movea.l    d7,a0            ;出力バッファの先頭
  515.     movea.l    a6,a1            ;入力データの先頭
  516. *    movea.l    a2,a2            ;入力データの末尾+1
  517.     movea.l    preconv_routine,a6    ;PCMデータをOPMのTLの並びに変換する
  518.     jsr    (a6)
  519.  
  520.     move.l    a0,d0            ;出力データの末尾+1
  521.     sub.l    a1,d0            ;出力データの長さ
  522.     beq    99f
  523.  
  524.     tas.b    (-1,a0)            ;エンドコードを付加する
  525.     smi.b    d1
  526.     neg.b    d1
  527.     sf.b    (a0)
  528.     move.b    d1,(1,a0)        ;0,1(末尾のデータのbit7の値)
  529.  
  530.     move.l    a1,nxttop
  531.  
  532.     tst.l    d0
  533. 99:    movem.l    (sp)+,d1-d7/a0-a6
  534.     rts
  535.  
  536. 80:    move.w    #EXIT_FILE_READ_ERROR,exit_code
  537.     lea.l    (m_read_file_error,pc),a0
  538.     bsr    eprintcrlf
  539. 90:    moveq.l    #-1,d0
  540.     bra    99b
  541.  
  542. m_read_file_error:    .dc.b    13,10
  543.             .dc.b    '読み込みエラー',0
  544.  
  545. ;----------------------------------------------------------------
  546. ;ファイルをクローズする
  547.     .text
  548.     .align    4,$2048
  549. close_file::
  550.     move.w    fileno,d0
  551.     ble    @f            ;オープンしていないまたは標準入力
  552.     move.w    d0,-(sp)
  553.     DOS    _CLOSE
  554.     addq.l    #2,sp
  555.     move.w    #-1,fileno
  556. @@:    moveq.l    #0,d0
  557.     rts
  558.  
  559. ;----------------------------------------------------------------
  560. ;入力データの残りバイト数を得る
  561. ;>d0.l:データの残りバイト数
  562.     .text
  563.     .align    4,$2048
  564. get_restsize_file::
  565.     move.l    restsize,d0
  566.     rts
  567.  
  568. ;----------------------------------------------------------------
  569. ;AIFFヘッダの解析
  570. ;<d0.w:ファイルハンドル(チェックを開始する位置をシークしてあること)
  571. ;>d0.l:0=AIFFファイル,-1=AIFFファイルではない,1=未対応のAIFFファイル
  572. ;>d1.l:チャンネル数(1=モノラル,2=ステレオ)
  573. ;>d2.l:サンプリング周波数(44100など)
  574. ;>d3.l:ビット数(8=符号なし8ビット,16=符号つき16ビット),現在は16のみ
  575. ;>d4.l:データ本体のサイズ
  576. ;>z-flag:eq=AIFFファイル,ne=AIFFファイルではない/未対応のAIFFファイル
  577. ;>n-flag:pl=AIFFファイル,mi=AIFFファイルではない
  578. ;>シーク位置:(eq)データの先頭位置,(ne)変化しない
  579.     .text
  580.     .align    4,$2048
  581. aiff_check:
  582.     movem.l    d1-d4/d7/a0-a4,-(sp)    ;AIFFファイルならばd1-d4は捨てられる
  583.  
  584. ;ヘッダのバッファを確保する
  585.     lea.l    (-(AIFF_CHECK_LENGTH+4),sp),sp
  586.  
  587.     move.w    d0,d7            ;ファイルハンドル
  588.  
  589. ;ヘッダのバッファを初期化しておく
  590.     movea.l    sp,a0
  591.     move.w    #(AIFF_CHECK_LENGTH+4)/2-1,d0
  592. @@:    clr.w    (a0)+
  593.     dbra    d0,@b
  594.  
  595. ;ヘッダを読み込む
  596.     movea.l    sp,a2
  597.     movea.l    sp,a4            ;エラー処理用に必要
  598.     pea.l    AIFF_CHECK_LENGTH.w
  599.     move.l    a2,-(sp)
  600.     move.w    d7,-(sp)
  601.     DOS    _READ
  602.     lea.l    (10,sp),sp
  603.     tst.l    d0
  604.     bmi    90f
  605.     lea.l    (a2,d0.l),a4        ;読み込んだヘッダの末尾+1
  606.     cmp.l    #(4+4)+(4)+(4+4+2+4+2+2+2)+(4+4+8),d0
  607.                     ;最低でも(4+4)+(4)+(4+4+2+4+2+2+2)+(4+4+8)=48バイト以上必要
  608.     blo    90f
  609.  
  610. ;ヘッダの検索
  611.     lea.l    (str_FORM,pc),a1
  612.     movea.l    a2,a0
  613.     moveq.l    #4,d0
  614.     bsr    strncmp
  615.     bne    90f
  616.  
  617.     addq.l    #4+4,a2
  618.  
  619. 1:    lea.l    (str_AIFF,pc),a1
  620.     movea.l    a2,a0
  621.     moveq.l    #4,d0
  622.     bsr    strncmp
  623.     beq    2f
  624.     addq.l    #1,a2
  625.     cmpa.l    a4,a2
  626.     blo    1b
  627.     bra    90f            ;AIFFヘッダが見つからない
  628. 2:
  629.     addq.l    #4,a2
  630.  
  631. 1:    lea.l    (str_COMM,pc),a1
  632.     movea.l    a2,a0
  633.     moveq.l    #4,d0
  634.     bsr    strncmp
  635.     beq    2f
  636.     addq.l    #1,a2
  637.     cmpa.l    a4,a2
  638.     blo    1b
  639.     bra    90f            ;COMMヘッダが見つからない
  640. 2:
  641.     lea.l    (4+4+2+4+2+2+2,a2),a0    ;COMMヘッダは全部で4+4+2+4+2+2+2=20バイト以上必要
  642.     cmpa.l    a0,a4
  643.     blo    90f            ;COMMヘッダの末尾まで読めていない
  644.  
  645.     lea.l    (4,a2),a0        ;length
  646.     bsr    getmem_long_big
  647.     cmp.l    #2+4+2+2+2,d0
  648.     blo    90f            ;COMMヘッダが短すぎる
  649.  
  650.     lea.l    (4+4,a2,d0.l),a3    ;COMMヘッダの末尾
  651.     cmpa.l    a3,a4
  652.     blo    90f            ;SSNDヘッダが読み込めていない
  653.  
  654. 1:    lea.l    (str_SSND,pc),a1
  655.     movea.l    a3,a0
  656.     moveq.l    #4,d0
  657.     bsr    strncmp
  658.     beq    2f
  659.     addq.l    #1,a3
  660.     cmpa.l    a4,a3
  661.     blo    1b
  662.     bra    90f            ;SSNDヘッダが見つからない
  663.  
  664. 2:    lea.l    (4+4+8,a3),a0        ;SSNDヘッダは全部で4+4+8=16バイト
  665.     cmpa.l    a0,a4
  666.     blo    90f            ;SSNDヘッダの末尾まで読めていない
  667.  
  668. ;COMMヘッダの確認
  669.     lea.l    (4+4,a2),a0
  670.     bsr    getmem_word_big
  671.     move.l    d0,d1            ;1=mono,2=stereo
  672.     beq    91f
  673.     subq.l    #3,d0
  674.     bcc    91f
  675.  
  676.     lea.l    (4+4+2,a2),a0        ;length
  677.     bsr    getmem_long_big
  678.     move.l    d0,d4
  679.     beq    91f            ;データの長さが0
  680.  
  681.     lea.l    (4+4+2+4,a2),a0
  682.     bsr    getmem_word_big
  683.     move.l    d0,d3            ;1データのビット数
  684.     cmp.l    #16,d0
  685.     bne    91f
  686.  
  687.     lea.l    (4+4+2+4+2+2,a2),a0
  688.     bsr    getmem_word_big
  689.     move.l    d0,d2            ;サンプリング周波数
  690.     cmp.l    #1,d1            ;1=mono,2=stereo
  691.     bne    1f
  692.     cmp.l    #MIN_FREQUENCY_MONO,d2
  693.     blo    91f
  694.     cmp.l    #MAX_FREQUENCY_MONO,d2
  695.     bhi    91f
  696.     bra    2f
  697. 1:    cmp.l    #MIN_FREQUENCY_STEREO,d2
  698.     blo    91f
  699.     cmp.l    #MAX_FREQUENCY_STEREO,d2
  700.     bhi    91f
  701. 2:
  702.  
  703.     add.l    d4,d4            ;8ビットのとき1倍,16ビットのとき2倍
  704.     lsl.l    d1,d4            ;モノラルのとき1倍,ステレオのとき2倍
  705.                     ;データのバイトサイズ
  706.  
  707. ;データの先頭をシークする
  708.     lea.l    (4+4+8,a3),a0        ;データの先頭
  709.     suba.l    a4,a0            ;現在位置からデータの先頭までのオフセット(負数)
  710.     move.w    #1,-(sp)        ;現在位置から
  711.     move.l    a0,-(sp)
  712.     move.w    d7,-(sp)
  713.     DOS    _SEEK
  714.     addq.l    #8,sp
  715.  
  716.     lea.l    (AIFF_CHECK_LENGTH+4,sp),sp
  717.  
  718.     moveq.l    #0,d0
  719.     lea.l    (4*4,sp),sp        ;元のd1-d4を捨てる
  720.  
  721. 99:    movem.l    (sp)+,d7/a0-a4
  722.     rts
  723.  
  724. 90:    moveq.l    #-1,d0            ;AIFFファイルではない
  725.     bra    97f
  726. 91:    moveq.l    #1,d0            ;未対応のAIFFファイル
  727.  
  728. 97:    move.l    d0,d1
  729.  
  730.     movea.l    sp,a0            ;開始位置
  731.     suba.l    a4,a0            ;現在位置から開始位置までのオフセット(正数)
  732.     move.w    #1,-(sp)        ;現在位置から
  733.     move.l    a0,-(sp)
  734.     move.w    d7,-(sp)
  735.     DOS    _SEEK
  736.     addq.l    #8,sp
  737.  
  738.     move.l    d1,d0
  739.  
  740.     lea.l    (AIFF_CHECK_LENGTH+4,sp),sp
  741.  
  742.     movem.l    (sp)+,d1-d4        ;元の値を復元する
  743.     bra    99b
  744.  
  745. str_FORM:    .dc.b    'FORM'
  746. str_AIFF:    .dc.b    'AIFF'
  747. str_COMM:    .dc.b    'COMM'
  748. str_SSND:    .dc.b    'SSND'
  749.     .even
  750.  
  751. ;----------------------------------------------------------------
  752. ; FMPファイルの構造
  753. ;    第1識別子(ファイルの種類を表す)
  754. ;        .dc.b    'FMP '
  755. ;    以降はセパレータ($1A)まで任意の文字列
  756. ;        通常は,1行目をプログラムのヘッダ,2行目をコマンドラインとする
  757. ;    セーブしたプログラムの名称とバージョン(m_banner)
  758. ;        .dc.b    PROGNAME,'.X'
  759. ;        .dc.b    ' <<Stereo PCM player with built-in OPM>> '
  760. ;        .dc.b    'v',VERSION,' (',DATE,') by M.Kamada',13,10
  761. ;    セーブ方法(セーブ時の環境変数とコマンドラインをそのまま記録)
  762. ;        .dc.b    'set S44PLAY=-force',13,10
  763. ;        .dc.b    'set CDROM=6',13,10
  764. ;        .dc.b    'A:\BIN\s44play.x 1 -c track1.fmp',13,10
  765. ;    セパレータ
  766. ;        .dc.b    $1A
  767. ;    第2識別子(以下の構造を表す)
  768. ;        .dc.l    'S44P'
  769. ;        .dc.l    FMP_VERSION
  770. ;    ヘッダのサイズ
  771. ;        .dc.l    4+4        ;データ本体のサイズ以降を含まない
  772. ;    ヘッダ
  773. ;     チャンネル数(1=モノラル,2=ステレオ)
  774. ;        .dc.l    2
  775. ;     サンプリング周波数(44100)
  776. ;        .dc.l    44100
  777. ;     (バージョンが上がったときは,新しい項目をここに挿入する)
  778. ;    データ本体のサイズ
  779. ;        .dc.l    ?
  780. ;    データ本体
  781. ;        .dc.b    ~
  782.  
  783. ;----------------------------------------------------------------
  784. ;FMPヘッダの解析
  785. ;<d0.w:ファイルハンドル(チェックを開始する位置をシークしてあること)
  786. ;>d0.l:0=FMPファイル,-1=FMPファイルではない,1=未対応のFMPファイル
  787. ;>d1.l:チャンネル数(1=モノラル,2=ステレオ)
  788. ;>d2.l:サンプリング周波数(44100など)
  789. ;>d3.l:ビット数,16のみ
  790. ;>d4.l:データ本体のサイズ
  791. ;>z-flag:eq=FMPファイル,ne=FMPファイルではない/未対応のFMPファイル
  792. ;>n-flag:pl=FMPファイル,mi=FMPファイルではない
  793. ;>シーク位置:(eq)データの先頭位置,(ne)変化しない
  794.     .text
  795.     .align    4,$2048
  796. fmp_check:
  797.     movem.l    d1-d4/d6-d7/a0/a2/a4,-(sp)    ;FMPファイルならばd1-d4は捨てられる
  798.  
  799. ;ヘッダのバッファを確保する
  800.     lea.l    (-(FMP_CHECK_LENGTH+4),sp),sp
  801.  
  802.     move.w    d0,d7            ;ファイルハンドル
  803.  
  804. ;ヘッダのバッファを初期化しておく
  805.     movea.l    sp,a0
  806.     move.w    #(FMP_CHECK_LENGTH+4)/2-1,d0
  807. @@:    clr.w    (a0)+
  808.     dbra    d0,@b
  809.  
  810. ;ヘッダを読み込む
  811.     movea.l    sp,a0
  812.     movea.l    sp,a4            ;エラー処理用に必要
  813.     pea.l    FMP_CHECK_LENGTH.w
  814.     move.l    a0,-(sp)
  815.     move.w    d7,-(sp)
  816.     DOS    _READ
  817.     lea.l    (10,sp),sp
  818.     tst.l    d0
  819.     bmi    90f
  820.     lea.l    (a0,d0.l),a4        ;読み込んだヘッダの末尾+1
  821.     cmp.l    #4+1,d0            ;最低でも4+1=5バイト以上必要
  822.     blo    90f
  823.  
  824. ;'FMP 'を確認
  825.     bsr    getmem_long_big
  826.     cmp.l    #'FMP ',d0
  827.     bne    90f            ;'FMP 'で始まっていない
  828. ;<a0.l:'FMP 'の直後
  829.  
  830. ;$1Aまでスキップする
  831.     move.l    a4,d1
  832.     sub.w    a0,d1            ;5バイト以上読み込んであるので1以上になる
  833.     moveq.l    #$1A,d0
  834.     subq.w    #1,d1
  835. 1:    cmp.b    (a0)+,d0
  836.     dbeq    d1,1b
  837.     bne    90f            ;$1Aがない
  838. ;<a0.l:$1Aの直後
  839.  
  840. ;'S44P'を確認
  841.     bsr    getmem_long_big
  842.     cmp.l    #'S44P',d0
  843.     bne    90f            ;'S44P'でない
  844. ;<a0.l:'S44P'の直後
  845.  
  846. ;バージョンを確認
  847.     bsr    getmem_long_big
  848.     cmpa.l    a4,a0
  849.     bcc    90f
  850.     cmp.l    #'0.77',d0        ;FMPファイルはVERSION='0.77'から
  851.     blo    90f
  852.     cmp.l    #'9.99',d0        ;念のため先頭が数字であることを確認しておく
  853.     bhi    90f
  854.     cmp.l    #FMP_VERSION,d0        ;自分よりも新しいヘッダは解釈できない
  855.     bhi    91f
  856.     move.l    d0,d6            ;バージョン
  857. ;<a0.l:バージョンの直後
  858.  
  859. ;ヘッダのサイズを確認
  860.     bsr    getmem_long_big
  861.     cmpa.l    a4,a0
  862.     bcc    90f
  863.     cmp.l    #FMP_CHECK_LENGTH,d0    ;ヘッダの末尾の位置が手前になってしまわないようにする
  864.     bcc    90f
  865.     lea.l    (4,a0,d0.l),a2        ;ヘッダの末尾+4=データ本体のサイズの直後
  866.     cmpa.l    a4,a2            ;データの直前まで読み込めていなければエラー
  867.     bhi    90f
  868.  
  869. ;チャンネル数
  870.     bsr    getmem_long_big
  871.     tst.l    d0
  872.     beq    91f
  873.     cmp.l    #2,d0
  874.     bhi    91f
  875.     move.l    d0,d1            ;チャンネル数(1=モノラル,2=ステレオ)
  876.  
  877. ;サンプリング周波数
  878.     bsr    getmem_long_big
  879.     move.l    d0,d2            ;サンプリング周波数
  880.  
  881. ;ビット数
  882.     moveq.l    #16,d3
  883.  
  884. ;データ本体のサイズ
  885.     lea.l    (-4,a2),a0
  886.     bsr    getmem_long_big
  887.     move.l    d0,d4            ;データ本体のサイズ
  888.  
  889. ;データの先頭をシークする
  890. ;    movea.l    a2,a0            ;データの先頭
  891.     suba.l    a4,a0            ;現在位置からデータの先頭までのオフセット(負数)
  892.     move.w    #1,-(sp)        ;現在位置から
  893.     move.l    a0,-(sp)
  894.     move.w    d7,-(sp)
  895.     DOS    _SEEK
  896.     addq.l    #8,sp
  897.  
  898.     lea.l    (FMP_CHECK_LENGTH+4,sp),sp
  899.  
  900.     moveq.l    #0,d0
  901.     lea.l    (4*4,sp),sp        ;元のd1-d4を捨てる
  902.  
  903. 99:    movem.l    (sp)+,d6-d7/a0/a2/a4
  904.     rts
  905.  
  906. 90:    moveq.l    #-1,d0            ;FMPファイルではない
  907.     bra    97f
  908. 91:    moveq.l    #1,d0            ;未対応のFMPファイル
  909.  
  910. 97:    move.l    d0,d1
  911.  
  912.     movea.l    sp,a0            ;開始位置
  913.     suba.l    a4,a0            ;現在位置から開始位置までのオフセット(正数)
  914.     move.w    #1,-(sp)        ;現在位置から
  915.     move.l    a0,-(sp)
  916.     move.w    d7,-(sp)
  917.     DOS    _SEEK
  918.     addq.l    #8,sp
  919.  
  920.     move.l    d1,d0
  921.  
  922.     lea.l    (FMP_CHECK_LENGTH+4,sp),sp
  923.  
  924.     movem.l    (sp)+,d1-d4        ;元の値を復元する
  925.     bra    99b
  926.  
  927. ;----------------------------------------------------------------
  928. ;WAVEヘッダの解析
  929. ;<d0.w:ファイルハンドル(チェックを開始する位置をシークしてあること)
  930. ;>d0.l:0=WAVEファイル,-1=WAVEファイルではない,1=未対応のWAVEファイル
  931. ;>d1.l:チャンネル数(1=モノラル,2=ステレオ)
  932. ;>d2.l:サンプリング周波数(44100など)
  933. ;>d3.l:ビット数(8=符号なし8ビット,16=符号つき16ビット),現在は16のみ
  934. ;>d4.l:データ本体のサイズ
  935. ;>z-flag:eq=WAVEファイル,ne=WAVEファイルではない/未対応のWAVEファイル
  936. ;>n-flag:pl=WAVEファイル,mi=WAVEファイルではない
  937. ;>シーク位置:(eq)データの先頭位置,(ne)変化しない
  938.     .text
  939.     .align    4,$2048
  940. wave_check:
  941.     movem.l    d1-d4/d7/a0-a4,-(sp)    ;WAVEファイルならばd1-d4は捨てられる
  942.  
  943. ;ヘッダのバッファを確保する
  944.     lea.l    (-(WAVE_CHECK_LENGTH+4),sp),sp
  945.  
  946.     move.w    d0,d7            ;ファイルハンドル
  947.  
  948. ;ヘッダのバッファを初期化しておく
  949.     movea.l    sp,a0
  950.     move.w    #(WAVE_CHECK_LENGTH+4)/2-1,d0
  951. @@:    clr.w    (a0)+
  952.     dbra    d0,@b
  953.  
  954. ;ヘッダを読み込む
  955.     movea.l    sp,a2
  956.     movea.l    sp,a4            ;エラー処理用に必要
  957.     pea.l    WAVE_CHECK_LENGTH.w
  958.     move.l    a2,-(sp)
  959.     move.w    d7,-(sp)
  960.     DOS    _READ
  961.     lea.l    (10,sp),sp
  962.     tst.l    d0
  963.     bmi    90f
  964.     lea.l    (a2,d0.l),a4        ;読み込んだヘッダの末尾+1
  965.     cmp.l    #(4+4+16)+(4+4),d0    ;最低でも(4+4+16)+(4+4)=32バイト以上必要
  966.     blo    90f
  967.  
  968. ;ヘッダの検索
  969.     lea.l    (str_riff,pc),a1
  970.     movea.l    a2,a0
  971.     moveq.l    #4,d0
  972.     bsr    strncmp
  973.     bne    90f
  974.  
  975. 1:    lea.l    (str_fmt,pc),a1
  976.     movea.l    a2,a0
  977.     moveq.l    #3,d0
  978.     bsr    strncmp
  979.     beq    2f
  980.     addq.l    #1,a2
  981.     cmpa.l    a4,a2
  982.     blo    1b
  983.     bra    90f            ;fmtヘッダが見つからない
  984.  
  985. 2:    lea.l    (4+4+16,a2),a0        ;fmtヘッダは全部で4+4+16=24バイト以上必要
  986.     cmpa.l    a0,a4
  987.     blo    90f            ;fmtヘッダの末尾まで読めていない
  988.  
  989.     lea.l    (4,a2),a0        ;length
  990.     bsr    getmem_long_little
  991.     cmp.l    #16,d0
  992.     blo    90f            ;fmtヘッダが短すぎる
  993.     lea.l    (a2,d0.l),a3        ;fmtヘッダの末尾
  994.     cmpa.l    a3,a4
  995.     blo    90f            ;dataヘッダが読み込めていない
  996.  
  997. 1:    lea.l    (str_data,pc),a1
  998.     movea.l    a3,a0
  999.     moveq.l    #4,d0
  1000.     bsr    strncmp
  1001.     beq    2f
  1002.     addq.l    #1,a3
  1003.     cmpa.l    a4,a3
  1004.     blo    1b
  1005.     bra    90f            ;dataヘッダが見つからない
  1006.  
  1007. 2:    lea.l    (4+4,a3),a0        ;dataヘッダは全部で4+4=8バイト以上必要
  1008.     cmpa.l    a0,a4
  1009.     blo    90f            ;dataヘッダの末尾まで読めていない
  1010.  
  1011. ;fmtヘッダの確認
  1012.     lea.l    (8,a2),a0        ;compressed
  1013.     bsr    getmem_word_little
  1014.     subq.l    #1,d0
  1015.     bne    91f            ;非圧縮でない
  1016.  
  1017.     lea.l    (10,a2),a0
  1018.     bsr    getmem_word_little
  1019.     move.l    d0,d1            ;1=mono,2=stereo
  1020.     beq    91f
  1021.     subq.l    #3,d0
  1022.     bcc    91f
  1023.  
  1024.     lea.l    (12,a2),a0
  1025.     bsr    getmem_long_little
  1026.     move.l    d0,d2            ;サンプリング周波数
  1027.     cmp.l    #1,d1            ;1=mono,2=stereo
  1028.     bne    1f
  1029.     cmp.l    #MIN_FREQUENCY_MONO,d2
  1030.     blo    91f
  1031.     cmp.l    #MAX_FREQUENCY_MONO,d2
  1032.     bhi    91f
  1033.     bra    2f
  1034. 1:    cmp.l    #MIN_FREQUENCY_STEREO,d2
  1035.     blo    91f
  1036.     cmp.l    #MAX_FREQUENCY_STEREO,d2
  1037.     bhi    91f
  1038. 2:
  1039.  
  1040.     lea.l    (22,a2),a0
  1041.     bsr    getmem_word_little
  1042.     move.l    d0,d3            ;1データのビット数
  1043.     cmp.l    #16,d0
  1044.     bne    91f
  1045.  
  1046. ;dataヘッダの確認
  1047.     lea.l    (4,a3),a0        ;length
  1048.     bsr    getmem_long_little
  1049.     move.l    d0,d4
  1050.     beq    91f            ;データの長さが0
  1051.  
  1052. ;データの先頭をシークする
  1053.     lea.l    (8,a3),a0        ;データの先頭
  1054.     suba.l    a4,a0            ;現在位置からデータの先頭までのオフセット(負数)
  1055.     move.w    #1,-(sp)        ;現在位置から
  1056.     move.l    a0,-(sp)
  1057.     move.w    d7,-(sp)
  1058.     DOS    _SEEK
  1059.     addq.l    #8,sp
  1060.  
  1061.     lea.l    (WAVE_CHECK_LENGTH+4,sp),sp
  1062.  
  1063.     moveq.l    #0,d0
  1064.     lea.l    (4*4,sp),sp        ;元のd1-d4を捨てる
  1065.  
  1066. 99:    movem.l    (sp)+,d7/a0-a4
  1067.     rts
  1068.  
  1069. 90:    moveq.l    #-1,d0            ;WAVEファイルではない
  1070.     bra    97f
  1071. 91:    moveq.l    #1,d0            ;未対応のWAVEファイル
  1072.  
  1073. 97:    move.l    d0,d1
  1074.  
  1075.     movea.l    sp,a0            ;開始位置
  1076.     suba.l    a4,a0            ;現在位置から開始位置までのオフセット(正数)
  1077.     move.w    #1,-(sp)        ;現在位置から
  1078.     move.l    a0,-(sp)
  1079.     move.w    d7,-(sp)
  1080.     DOS    _SEEK
  1081.     addq.l    #8,sp
  1082.  
  1083.     move.l    d1,d0
  1084.  
  1085.     lea.l    (WAVE_CHECK_LENGTH+4,sp),sp
  1086.  
  1087.     movem.l    (sp)+,d1-d4        ;元の値を復元する
  1088.     bra    99b
  1089.  
  1090. str_riff:    .dc.b    'RIFF'
  1091. str_fmt:    .dc.b    'fmt'
  1092. str_data:    .dc.b    'data'
  1093.     .even
  1094.  
  1095. ;----------------------------------------------------------------
  1096. ;メモリからbig-endianの16ビットのデータを取り出す
  1097. ;<a0.l:アドレス
  1098. ;>d0.l:データ
  1099. ;>a0.l:データの直後のアドレス
  1100.     .text
  1101.     .align    4,$2048
  1102. getmem_word_big:
  1103.     moveq.l    #0,d0
  1104.     move.b    (a0)+,d0
  1105.     lsl.w    #8,d0
  1106.     move.b    (a0)+,d0
  1107.     rts
  1108.  
  1109. ;----------------------------------------------------------------
  1110. ;メモリからbig-endianの32ビットのデータを取り出す
  1111. ;<a0.l:アドレス
  1112. ;>d0.l:データ
  1113. ;>a0.l:データの直後のアドレス
  1114.     .text
  1115.     .align    4,$2048
  1116. getmem_long_big:
  1117.     move.b    (a0)+,d0
  1118.     lsl.w    #8,d0
  1119.     move.b    (a0)+,d0
  1120.     swap.w    d0
  1121.     move.b    (a0)+,d0
  1122.     lsl.w    #8,d0
  1123.     move.b    (a0)+,d0
  1124.     rts
  1125.  
  1126. ;----------------------------------------------------------------
  1127. ;メモリからlittle-endianの16ビットのデータを取り出す
  1128. ;<a0.l:アドレス
  1129. ;>d0.l:データ
  1130. ;>a0.l:データの直後のアドレス
  1131.     .text
  1132.     .align    4,$2048
  1133. getmem_word_little:
  1134.     moveq.l    #0,d0
  1135.     move.b    (a0)+,d0
  1136.     ror.w    #8,d0
  1137.     move.b    (a0)+,d0
  1138.     ror.w    #8,d0
  1139.     rts
  1140.  
  1141. ;----------------------------------------------------------------
  1142. ;メモリからlittle-endianの32ビットのデータを取り出す
  1143. ;<a0.l:アドレス
  1144. ;>d0.l:データ
  1145. ;>a0.l:データの直後のアドレス
  1146.     .text
  1147.     .align    4,$2048
  1148. getmem_long_little:
  1149.     move.b    (a0)+,d0
  1150.     ror.l    #8,d0
  1151.     move.b    (a0)+,d0
  1152.     ror.l    #8,d0
  1153.     move.b    (a0)+,d0
  1154.     ror.l    #8,d0
  1155.     move.b    (a0)+,d0
  1156.     ror.l    #8,d0
  1157.     rts
  1158.  
  1159.